FrameLib  0.1
Arbitrarily timed and sized frame-based DSP
FrameLib_Context.h
Go to the documentation of this file.
1 
2 #ifndef FRAMELIB_CONTEXT_H
3 #define FRAMELIB_CONTEXT_H
4 
5 #include "FrameLib_Global.h"
6 
7 // The Context Object (used to define non-connectable areas in the host environment)
8 // This acts as a proxy to the global object with a suitable reference to the context
9 
11 {
12  // Type definition for concision
13 
14  typedef FrameLib_Global Global;
15 
16  // Non-copyable template class for retaining reference counted pointers using RAII
17 
18  template <class T, T *(Global::*getMethod)(void *), void(Global::*releaseMethod)(void *)> class ManagedPointer
19  {
20 
21  public:
22 
23  ManagedPointer(const FrameLib_Context &context) : mGlobal(context.mGlobal), mReference(context.mReference)
24  {
25  mPointer = (mGlobal->*getMethod)(mReference);
26  }
27 
28  ~ManagedPointer()
29  {
30  release();
31  }
32 
33  // Release
34 
35  void release()
36  {
37  if (mGlobal)
38  (mGlobal->*releaseMethod)(mReference);
39  mPointer = NULL;
40  mGlobal = NULL;
41  mReference = NULL;
42  }
43 
44  // Pointer / Bool Conversion
45 
46  T *operator->() { return mPointer; }
47  operator bool() const { return mPointer != NULL; }
48 
49  private:
50 
51  // Deleted
52 
53  ManagedPointer(const ManagedPointer&);
54  ManagedPointer& operator=(const ManagedPointer&);
55 
56  // Member Variables
57 
58  T *mPointer;
59  FrameLib_Global *mGlobal;
60  void *mReference;
61  };
62 
63 public:
64 
65  // Constructor - the reference should be a suitable reference address in the host environment
66 
67  FrameLib_Context(FrameLib_Global *global, void *reference) : mGlobal(global), mReference(reference) {}
68 
69  // Construct one of these objects to retain a relevant object
70 
71  typedef ManagedPointer<FrameLib_LocalAllocator, &Global::getAllocator, &Global::releaseAllocator> Allocator;
72  typedef ManagedPointer<FrameLib_ConnectionQueue, &Global::getConnectionQueue, &Global::releaseConnectionQueue> ConnectionQueue;
73  typedef ManagedPointer<FrameLib_DSPQueue, &Global::getDSPQueue, &Global::releaseDSPQueue> DSPQueue;
74 
75 private:
76 
77  FrameLib_Global *mGlobal;
78  void *mReference;
79 };
80 
81 
82 #endif
FrameLib_Context(FrameLib_Global *global, void *reference)
Definition: FrameLib_Context.h:67
Definition: FrameLib_Global.h:85
Definition: FrameLib_Context.h:10
ManagedPointer< FrameLib_ConnectionQueue, &Global::getConnectionQueue, &Global::releaseConnectionQueue > ConnectionQueue
Definition: FrameLib_Context.h:72
ManagedPointer< FrameLib_DSPQueue, &Global::getDSPQueue, &Global::releaseDSPQueue > DSPQueue
Definition: FrameLib_Context.h:73
ManagedPointer< FrameLib_LocalAllocator, &Global::getAllocator, &Global::releaseAllocator > Allocator
Definition: FrameLib_Context.h:71